/*
 * Copyright 2010 Michael Nitsche
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

package de.mnit.basis.daten.typ.zeit;

import java.util.GregorianCalendar;

import de.mnit.basis.daten.FormatZahl;
import de.mnit.basis.daten.konstant.ZEIT;
import de.mnit.basis.fehler.Fehler;


/**
 * @author Michael Nitsche
 */
public class Zeit {

	public static final boolean istSchaltjahr(int jahr) {
		return jahr%400==0 || (jahr%4==0 && jahr%100!=0);
	}

	public static final int gTageImJahr(int jahr) {
		return istSchaltjahr(jahr)? 366 :365;
	}

	public static final int gTageImMonat(int jahr, int monat) {
		Fehler.zahl.wenn_Ausserhalb(1,12,monat);
		return monat==2 && istSchaltjahr(jahr)
			? 29
			: ZEIT.TAGE_IM_MONAT_MIN[monat-1];
	}

	public static final String gWochentag(int zahl) {
		Fehler.zahl.wenn_Ausserhalb(0, 7, zahl);
		return zahl==0
			? ZEIT.WOCHENTAG_DE[6]
            : ZEIT.WOCHENTAG_DE[zahl-1];
	}

	public static Integer gMonat(String monat) {
		monat=monat.toLowerCase();
		for(int n=1; n<=12; n++) {
			String de=ZEIT.MONATE_DE[n-1].toLowerCase();
			String en=ZEIT.MONATE_EN[n-1].toLowerCase();
			if(monat.equals(de))
				return n;
			if(monat.equals(de.substring(0, 3)))
				return n;
			if(monat.equals(en))
				return n;
			if(monat.equals(en.substring(0, 3)))
				return n;
		}
		return null;
	}

	/**
	 * TODO Nochmal prüfen!!!
	 */
	public static final int zuJahrLang(String jahr_kurz) {
		Fehler.objekt.wenn_Null(jahr_kurz);
		Fehler.zahl.wenn_Nicht(2, jahr_kurz.length());
		int erg= Integer.parseInt(jahr_kurz);
		return erg + (erg<30 ? 2000 : 1900);
	}

	/**
	 * Wandelt Sekunden in HH:MM:SS
	 */
	public static String zuHHMMSS(long sekunden) {
		int h=(int)(sekunden/3600);
		sekunden=sekunden-h*3600;
		int m=(int)(sekunden/60);
		sekunden=sekunden-m*60;
		int s=(int)sekunden;
		String text=
			FormatZahl.breite(2, h)
			+":"
			+FormatZahl.breite(2, m)
			+":"
			+FormatZahl.breite(2, s);
		return text;
	}

	public static long zuMilliSek(int jahr, int monat, int tag) {
		return new GregorianCalendar(jahr, monat-1, tag).getTimeInMillis();
	}

	public static long zuMilliSek(int jahr, int monat, int tag, int std, int min, int sek, int msek) {
		long erg=new GregorianCalendar(jahr, monat-1, tag).getTimeInMillis();
		return erg+zuMilliSek(std, min, sek, msek);
	}

	public static long zuMilliSek(int std, int min, int sek, int msek) {
		long erg=msek;
		erg+=((long)sek)*1000;
		erg+=((long)min)*1000*60;
		erg+=((long)std)*1000*60*60;
		return erg;
	}

}
